/*
 * Universidade Federal do Rio Grande do Norte.
 * Departamento de Computação.
 * Sistemas Digitais.
 * Sistema de controle de plantas.
 * 10/10/2011
 */
package interfaceplantaserial;

import java.util.logging.Level;
import java.util.logging.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * Classe para plotar os gráficos referentes a planta.
 * @author J.Felipe
 */
public class GraficoSerial extends Thread {
    
    /** O gráfico proprialmente dito. */
    private JFreeChart chart;
    /** Coleção que guardará os conjuntos de dados a serem plotados. */
    private XYSeriesCollection dataSet;
    /** Variável responsável pelo gráfico do que será recebido da planta. */
    private XYSeries leituraGrafico;
    /** Flag para indicar se a thread está ativa. */
    private boolean threadAtivada;
    /** Numero máximo de amostras do gráficos. */
    private int numAmostras;
    /** Variável para medir o tempo a ser exibido no gráfico. */
    private double tempo;
    /** Atributo para guardar o que está sendo recebido da planta. */
    private int recebido;
    /** Incremento do tempo .*/
    private final double incTempo = 0.01;
    
    /*
     * Contrutor da classe.
     */
    public GraficoSerial() {
        configurarGraficos();
    }
    
    /*
     * Método para configurar os gráficos.
     */
    private void configurarGraficos() {
        numAmostras = 200;

        leituraGrafico = new XYSeries("Leitura");        
        leituraGrafico.setMaximumItemCount(numAmostras);
        
        dataSet = new XYSeriesCollection();
        dataSet.addSeries(leituraGrafico);
        
        chart = ChartFactory.createXYLineChart(
                null, // chart title
                "Tempo", // x axis label
                "Sinais", // y axis label
                dataSet, // data
                PlotOrientation.VERTICAL,
                true, // include legend
                true, // tooltips
                true // urls
                );

    }
    
    public void parar(){
        threadAtivada = false;
    }
    
    /*
     * Método para plotar os gráficos.
     */
    public void plotar() {
        // Tempo deve ser reiniciado a cada novo grafico
        tempo = 0;
        // Limpar graficos anteriores
        leituraGrafico.clear();
        // Habilitar execucao da thread
        threadAtivada = true;
        if (!isAlive()) {
            start();
        }
    }

    @Override
    public void run() {
        while (true) {
            recebido =1;
            if (threadAtivada) {
                leituraGrafico.add(tempo, recebido);
            }            
            try {
                sleep(10);
            } catch (InterruptedException ex) {
                Logger.getLogger(GraficoSerial.class.getName()).log(Level.SEVERE, null, ex);
            }
            tempo += incTempo;
        }
    }

    public int getRecebido() {
        return recebido;
    }

    public void setRecebido(int recebido) {
        this.recebido = recebido;
    }

    public JFreeChart getChart() {
        return chart;
    }
}
